//
//  YHIMUIKitHelper.m
//  YHChat
//
//  Created by 银河 on 2019/2/18.
//  Copyright © 2019 yinhe. All rights reserved.
//

#import "YHIMUIKitHelper.h"
#import <ImSDK/IMMessageExt.h>
#import <YYText/YYText.h>
#import "YHIMUIKITConfig.h"
#import "YHIMUIKitConvCellData.h"



@interface YHIMUIKitConvCellData ()

@end


@implementation YHIMUIKitHelper

+ (YHIMUIKitConvCellData *)cellDataWithConv:(TIMConversation *)conv{
    YHIMUIKitConvCellData *cellData = [[YHIMUIKitConvCellData alloc] init];
    cellData.unReadCount = [YHIMUIKitHelper unReadCountWith:conv];
    cellData.convID = [YHIMUIKitHelper convIDWith:conv];
    cellData.messageDate = [YHIMUIKitHelper latestDateWith:conv];
    cellData.convType = [YHIMUIKitHelper convTypeWith:conv];
    cellData.title = [YHIMUIKitHelper titleForConv:conv];
    cellData.subTitle = [YHIMUIKitHelper subTitleForConv:conv];
    return cellData;
}

+ (int)unReadCountWith:(TIMConversation *)conv{
    return [conv getUnReadMessageNum];
}
+ (NSString *)convIDWith:(TIMConversation *)conv{
    return [conv getReceiver];
}
+ (NSDate *)latestDateWith:(TIMConversation *)conv{
    return [conv getLastMsg].timestamp;
}
+ (YHIMUIKitConvType)convTypeWith:(TIMConversation *)conv{
    YHIMUIKitConvType convType = YHIMUIKitConvType_System;
    TIMConversationType type = [conv getType];
    if (type == TIM_C2C) {
        convType = YHIMUIKitConvType_C2C;
    } else if (type == TIM_GROUP) {
        convType = YHIMUIKitConvType_Group;
    } else if (type == TIM_SYSTEM) {
        convType = YHIMUIKitConvType_System;
    }
    return convType;
}
+ (NSString *)titleForConv:(TIMConversation *)conv{
    NSString *retTitle = @"";
    TIMConversationType type = [conv getType];
    if (type == TIM_C2C) {
        retTitle = [conv getReceiver];
    } else if (type == TIM_GROUP) {
        retTitle = [conv getGroupName];
    } else if (type == TIM_SYSTEM) {
        retTitle = @"[系统消息]";
    }
    return retTitle;
}

+ (NSString *)subTitleForConv:(TIMConversation *)conv{
    NSString *retSubTitle = @"";
    TIMMessageDraft *draft = [conv getDraft];
    if (draft) {
        retSubTitle = [YHIMUIKitHelper __msgDraftDes:draft];
    } else {
        TIMMessage *msg = [conv getLastMsg];
        if (msg.status == TIM_MSG_STATUS_LOCAL_REVOKED) {
            if (msg.isSelf) {
                retSubTitle = @"你撤回了一条消息";
            } else {
                retSubTitle = [NSString stringWithFormat:@"\"%@\"撤回了一条消息", msg.sender];
            }
        } else {
            retSubTitle = [YHIMUIKitHelper __msgDes:msg];
        }
    }
    YHIMUIKitLog(@"[conv]:%@",retSubTitle);
    return retSubTitle;
}

// msg draft.
+ (NSString *)__msgDraftDes:(TIMMessageDraft *)draft{
    NSMutableArray<NSString *> *tmps = [NSMutableArray array];
    for (int i = 0; i < draft.elemCount; ++i) {
        NSString *s = @"";
        TIMElem *elem = [draft getElem:i];
        if([elem isKindOfClass:[TIMTextElem class]]){
            TIMTextElem *text = (TIMTextElem *)elem;
            s = text.text;
        } else if([elem isKindOfClass:[TIMCustomElem class]]){
            s = @"[自定义消息]";
        } else if([elem isKindOfClass:[TIMImageElem class]]){
            s = @"[图片]";
        } else if([elem isKindOfClass:[TIMSoundElem class]]){
            s = @"[语音]";
        } else if([elem isKindOfClass:[TIMVideoElem class]]){
            s = @"[视频]";
        } else if([elem isKindOfClass:[TIMFaceElem class]]){
            s = @"[表情]";
        } else if([elem isKindOfClass:[TIMFileElem class]]){
            s = @"[文件]";
        } else if([elem isKindOfClass:[TIMLocationElem class]]){
            s = @"[位置]";
        } else if([elem isKindOfClass:[TIMGroupTipsElem class]]){
            s = [YHIMUIKitHelper __convGroupTipsSubTitle:(TIMGroupTipsElem *)elem];
        } else if ([elem isKindOfClass:[TIMGroupSystemElem class]]) {
            s = [YHIMUIKitHelper __convGroupSysSubTitle:(TIMGroupSystemElem *)elem];
        }
        if (s.length > 0) {
            [tmps addObject:s];
        }
    }
    NSString *ts = [tmps componentsJoinedByString:@","];
    return [NSString stringWithFormat:@"[草稿]%@",ts];
}

// msg tip.
+ (NSString *)__msgDes:(TIMMessage *)msg{
    NSMutableArray<NSString *> *tmps = [NSMutableArray array];
    for (int i = 0; i < msg.elemCount; ++i) {
        NSString *s = @"";
        TIMElem *elem = [msg getElem:i];
        if([elem isKindOfClass:[TIMTextElem class]]){
            TIMTextElem *text = (TIMTextElem *)elem;
            s = text.text;
        } else if([elem isKindOfClass:[TIMCustomElem class]]){
            s = @"[自定义消息]";
        } else if([elem isKindOfClass:[TIMImageElem class]]){
            s = @"[图片]";
        } else if([elem isKindOfClass:[TIMSoundElem class]]){
            s = @"[语音]";
        } else if([elem isKindOfClass:[TIMVideoElem class]]){
            s = @"[视频]";
        } else if([elem isKindOfClass:[TIMFaceElem class]]){
            s = @"[表情]";
        } else if([elem isKindOfClass:[TIMFileElem class]]){
            s = @"[文件]";
        } else if([elem isKindOfClass:[TIMLocationElem class]]){
            s = @"[位置]";
        } else if([elem isKindOfClass:[TIMGroupTipsElem class]]){
            s = [YHIMUIKitHelper __convGroupTipsSubTitle:(TIMGroupTipsElem *)elem];
        } else if ([elem isKindOfClass:[TIMGroupSystemElem class]]) {
            s = [YHIMUIKitHelper __convGroupSysSubTitle:(TIMGroupSystemElem *)elem];
        }
        if (s.length > 0) {
            [tmps addObject:s];
        }
    }
    return [tmps componentsJoinedByString:@","];
}

// group tip.
+ (NSString *)__convGroupTipsSubTitle:(TIMGroupTipsElem *)tips{
    NSString *groupTip = @"";
    NSString *groupType = @"群组";
    
    switch (tips.type) {
        case TIM_GROUP_TIPS_TYPE_QUIT_GRP: // 退出群 (opUser & groupName & userList)
        {
            groupTip = [NSString stringWithFormat:@"\"%@\"退出了%@", tips.opUser, groupType];
        }
            break;
        case TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE: // 群成员资料变更 (opUser & groupName & memberInfoList)
        {
            NSMutableArray<NSString *> *tmpTips = [NSMutableArray array];
            NSArray<TIMGroupTipsElemMemberInfo *> *array = [tips memberChangeList];
            [array enumerateObjectsUsingBlock:^(TIMGroupTipsElemMemberInfo * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                if (obj.shutupTime == 0 ) {
                    [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"的禁言限制已取消", obj.identifier]];
                } else {
                    [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"被禁言%d秒", obj.identifier, obj.shutupTime]];
                }
            }];
            groupTip = [tmpTips componentsJoinedByString:@","];
        }
            break;
        case TIM_GROUP_TIPS_TYPE_INFO_CHANGE: // 群资料变更 (opUser & groupName & introduction & notification & faceUrl & owner)
        {
            NSMutableArray<NSString *> *tmpTips = [NSMutableArray array];
            NSArray<TIMGroupTipsElemGroupInfo *> *array = [tips groupChangeList];
            [array enumerateObjectsUsingBlock:^(TIMGroupTipsElemGroupInfo * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                switch (obj.type) {
                    case TIM_GROUP_INFO_CHANGE_GROUP_NAME: // 群名修改
                    {
                        [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"修改%@名称为\"%@\"", tips.opUser,  groupType, obj.value]];
                    }
                        break;
                    case TIM_GROUP_INFO_CHANGE_GROUP_INTRODUCTION: // 群简介修改
                    {
                        [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"修改了%@介绍", tips.opUser, groupType]];
                    }
                        break;
                    case TIM_GROUP_INFO_CHANGE_GROUP_NOTIFICATION: // 群公告修改
                    {
                        [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"修改了%@公告", tips.opUser, groupType]];
                    }
                        break;
                    case TIM_GROUP_INFO_CHANGE_GROUP_FACE: // 群头像修改
                    {
                        [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"修改%@头像", tips.opUser, groupType]];
                    }
                        break;
                    case TIM_GROUP_INFO_CHANGE_GROUP_OWNER: // 群主变更
                    {
                        [tmpTips addObject:[NSString stringWithFormat:@"\"%@\"已转让%@", tips.opUser, groupType]];
                    }
                        break;
                    default:
                        break;
                }
            }];
            groupTip = [tmpTips componentsJoinedByString:@","];
        }
            break;
        case TIM_GROUP_TIPS_TYPE_INVITE: // 邀请加入群 (opUser & groupName & userList)
        {
            groupTip = [NSString stringWithFormat:@"\"%@\"邀请\"%@\"进%@", tips.opUser, [tips.userList componentsJoinedByString:@","], groupType];
        }
            break;
            
        case TIM_GROUP_TIPS_TYPE_KICKED: // 踢出群 (opUser & groupName & userList)
        {
            groupTip = [NSString stringWithFormat:@"\"%@\"将\"%@\"踢出%@", tips.opUser, [tips.userList componentsJoinedByString:@","], groupType];
        }
            break;
        case TIM_GROUP_TIPS_TYPE_SET_ADMIN: // 设置管理员 (opUser & groupName & userList)
        {
            groupTip = [NSString stringWithFormat:@"\"%@\"将\"%@\"设置为管理员", tips.opUser, [tips.userList componentsJoinedByString:@","]];
        }
            break;
        case TIM_GROUP_TIPS_TYPE_CANCEL_ADMIN: // 取消管理员 (opUser & groupName & userList)
        {
            groupTip = [NSString stringWithFormat:@"\"%@\"取消了\"%@\"的管理员身份", tips.opUser, [tips.userList componentsJoinedByString:@","]];
        }
            break;
        default:
            break;
    }
    return groupTip;
}

// sys group tip.
+ (NSString *)__convGroupSysSubTitle:(TIMGroupSystemElem *)sysElem{
    NSString *sysTip = @"";
    switch (sysElem.type) {
        case TIM_GROUP_SYSTEM_ADD_GROUP_REQUEST_TYPE:// 申请加群请求（只有管理员会收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"申请加入群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_ADD_GROUP_ACCEPT_TYPE://  申请加群被同意（只有申请人能够收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"同意你加入群\"%@\"的请求", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_ADD_GROUP_REFUSE_TYPE:// 申请加群被拒绝（只有申请人能够收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"拒绝你加入群\"%@\"的请求", sysElem.user, sysElem.group];
            if (sysElem.msg.length) {
                NSString *s = [NSString stringWithFormat:@"，拒绝理由:%@", sysElem.msg];
                sysTip = [sysTip stringByAppendingString:s];
            }
        }
            break;
        case TIM_GROUP_SYSTEM_KICK_OFF_FROM_GROUP_TYPE:// 被管理员踢出群（只有被踢的人能够收到）
        {
            sysTip = [NSString stringWithFormat:@"您被\"%@\"踢出群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_DELETE_GROUP_TYPE:// 群被解散（全员能够收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"解散群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_CREATE_GROUP_TYPE:// 创建群消息（创建者能够收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"创建群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_INVITED_TO_GROUP_TYPE:// 邀请入群通知(被邀请者能够收到)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"邀请你加入群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_QUIT_GROUP_TYPE:// 主动退群（主动退群者能够收到）
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"退群\"%@\"成功", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_GRANT_ADMIN_TYPE://  设置管理员(被设置者接收)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"设置你为群\"%@\"的管理员", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_CANCEL_ADMIN_TYPE://  取消管理员(被取消者接收)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"取消你所在群\"%@\"的管理员资格", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_REVOKE_GROUP_TYPE:// 群已被回收(全员接收)
        {
            sysTip = [NSString stringWithFormat:@"群\"%@\"已被回收", sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_INVITE_TO_GROUP_REQUEST_TYPE://  邀请入群请求(被邀请者接收)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"邀请你加入群\"%@\"", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_INVITE_TO_GROUP_ACCEPT_TYPE://  邀请加群被同意(只有发出邀请者会接收到)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"同意你发出的加入群\"%@\"的邀请", sysElem.user, sysElem.group];
        }
            break;
        case TIM_GROUP_SYSTEM_INVITE_TO_GROUP_REFUSE_TYPE://   邀请加群被拒绝(只有发出邀请者会接收到)
        {
            sysTip = [NSString stringWithFormat:@"\"%@\"拒绝了你发出的加入群\"%@\"的邀请", sysElem.user, sysElem.group];
        }
            break;
        default:
            break;
    }
    return sysTip;
}


// 消息时间转换
+ (NSString *)transformMessageDate:(NSDate *)date{
    /**
     60秒之内        刚刚
     60分钟之内      xx分钟之前
     24小时之内      xx小时之前
     48小时之内      昨天
     72小时之内      前天
     其他           xxxx-MM-dd
     */
    NSString *formatString = @"";
    NSTimeInterval timeInterval = [date timeIntervalSinceNow];
    timeInterval = ABS(timeInterval);
    
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"HH:mm"];
    NSString *dateString = [dateFormat stringFromDate:date];
    
    if (timeInterval <= 60) {
        formatString = [NSString stringWithFormat:@"刚刚"];
    } else if (timeInterval / 60 <= 60) {
        formatString = [NSString stringWithFormat:@"%d分钟前",(int)(timeInterval / 60)];
    } else if (timeInterval / 3600 >= 1 && timeInterval / 3600 < 24) {
        formatString = [NSString stringWithFormat:@"%d小时前",(int)(timeInterval / 3600)];
    } else if (timeInterval / 3600 >= 24 && timeInterval / 3600 < 48) {
        formatString = [NSString stringWithFormat:@"昨天 %@",dateString];
    } else if (timeInterval / 3600 >= 48 && timeInterval / 3600 < 72) {
        formatString = [NSString stringWithFormat:@"前天 %@", dateString];
    } else {
        NSDateFormatter *ymdFormat = [[NSDateFormatter alloc] init];
        [ymdFormat setDateFormat:@"yyyy-MM-dd HH:mm"];
        formatString = [ymdFormat stringFromDate:date];
    }
    return formatString;
}


+ (NSMutableAttributedString *)attributedStringWithText:(NSString *)text
                                                  color:(UIColor *)color
                                                   font:(UIFont *)font
                                                   kern:(CGFloat)kern
                                            lineSpacing:(CGFloat)lineSpacing
                                              alignment:(NSTextAlignment)alignment{
    if (!text) {
        return [[NSMutableAttributedString alloc] initWithString:@""];
    }
    NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:text];
    
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineSpacing = lineSpacing;
    paragraphStyle.alignment = alignment;
    
    [attr addAttributes:@{NSForegroundColorAttributeName : color,
                          NSFontAttributeName : font,
                          NSKernAttributeName : @(kern),
                          NSParagraphStyleAttributeName : paragraphStyle
                          } range:NSMakeRange(0, text.length)];
    return attr;
}


// 将聊天内容转换为属性字符串，内部匹配了表情，电话号码，URL
+ (NSMutableAttributedString *)getMessageAttributedStringWith:(NSString *)text{
    NSString *regex_emoji = @"\\[[a-zA-Z0-9\\/\\u4e00-\\u9fa5]+\\]"; // 匹配表情
    NSString *regex_number = @"^[0-9]{7,23}"; // 匹配可能的电话号码，经测试，微信的规则是：最少7位数字，最多23位数字
    NSString *regex_url = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)"; // 匹配URL
    
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
    attributeString.yy_font = [UIFont systemFontOfSize:15];
    attributeString.yy_color = [UIColor blackColor];
    
    /*************************************************************************************************************************
     枚举:NSMatchingOptions的各个枚举值的解释，摘抄自网上，
     NSMatchingReportProgress            找到最长的匹配字符串后调用block回调
     NSMatchingReportCompletion          找到任何一个匹配串后都回调一次block
     NSMatchingAnchored                  从匹配范围的开始出进行极限匹配
     NSMatchingWithTransparentBounds     允许匹配的范围超出设置的范围
     NSMatchingWithoutAnchoringBounds    禁止^和$自动匹配行和结束
     
     网上有种说法：NSMatchingOptions除了在block回调中有用处之外，其他地方貌似都没什么意义，一般情况下都是给0；腾讯IM的demo种在此处也是给的0
     ************************************************************************************************************************/
    
    
    // 先匹配内容不会变的，再匹配内容会变的
    {
        // 匹配可能的电话号码
        NSError *error = nil;
        NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_number options:NSRegularExpressionDotMatchesLineSeparators error:&error];
        if (!error) {
            NSArray<NSTextCheckingResult *> *matches = [re matchesInString:attributeString.string options:0 range:attributeString.yy_rangeOfAll];
            [matches enumerateObjectsUsingBlock:^(NSTextCheckingResult * _Nonnull result, NSUInteger idx, BOOL * _Nonnull stop) {
                if (result && result.range.location != NSNotFound && result.range.length > 1) {
                    YHIMUIKitLog(@"匹配到电话号码:%@", [attributeString attributedSubstringFromRange:result.range]);
                    [attributeString yy_setColor:[UIColor redColor] range:result.range]; // 改变可能是电话号码字符串的颜色
                } else {
                    YHIMUIKitLog(@"%@", result);
                }
            }];
        } else {
            YHIMUIKitLog(@"正则匹配可能的电话号码失败:%@", error);
        }
    }
    {
        // 匹配url
        NSError *error = nil;
        NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_url options:NSRegularExpressionDotMatchesLineSeparators error:&error];
        if (!error) {
            NSArray<NSTextCheckingResult *> *matches = [re matchesInString:attributeString.string options:0 range:attributeString.yy_rangeOfAll];
            [matches enumerateObjectsUsingBlock:^(NSTextCheckingResult * _Nonnull result, NSUInteger idx, BOOL * _Nonnull stop) {
                if (result && result.range.location != NSNotFound && result.range.length > 1) {
                    YHIMUIKitLog(@"匹配到URL:%@", [attributeString attributedSubstringFromRange:result.range]);
                    [attributeString yy_setColor:[UIColor orangeColor] range:result.range]; // 改变URL字符串的颜色
                } else {
                    YHIMUIKitLog(@"%@", result);
                }
            }];
        } else {
            YHIMUIKitLog(@"正则匹配url失败:%@", error);
        }
    }
    {
        //匹配表情
        NSMutableArray<NSDictionary<NSString *, id> *> *results = [NSMutableArray array];
        NSError *error = nil;
        NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_emoji options:NSRegularExpressionDotMatchesLineSeparators error:&error];
        if (!error) {
            NSArray<NSTextCheckingResult *> *matches = [re matchesInString:attributeString.string options:0 range:attributeString.yy_rangeOfAll];
            [matches enumerateObjectsUsingBlock:^(NSTextCheckingResult * _Nonnull result, NSUInteger idx, BOOL * _Nonnull stop) {
                if (result && result.range.location != NSNotFound && result.range.length > 1) {
                    NSString *faceStr = [attributeString attributedSubstringFromRange:result.range].string;
                    YHIMUIKitLog(@"匹配到表情:%@", faceStr);
                    NSDictionary *dic = @{@"faceStr" : faceStr,
                                          @"range" : [NSValue valueWithRange:result.range]};
                    [results addObject:dic];
                } else {
                    YHIMUIKitLog(@"%@", result);
                }
            }];
        } else {
            YHIMUIKitLog(@"正则表情url失败:%@", error);
        }
        
        // 从后往前替换，否则会引起位置错乱，导致崩溃
        [results enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSDictionary<NSString *,id> * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSString *faceStr = [NSString stringWithFormat:@"%@",obj[@"faceStr"]];
            NSRange range = [obj[@"range"] rangeValue];
            
            UIImage *faceImage = [[YHIMUIKITConfig sharedInstance] getFaceImageWith:faceStr];
            if (faceImage) {
                NSMutableAttributedString *faceAtr = [NSMutableAttributedString yy_attachmentStringWithContent:faceImage contentMode:UIViewContentModeScaleAspectFit attachmentSize:faceImage.size alignToFont:[UIFont systemFontOfSize:15] alignment:YYTextVerticalAlignmentCenter];
                [attributeString replaceCharactersInRange:range withAttributedString:faceAtr];
            }
        }];
    }
    
    ///TODO:这儿可以增加其他正则匹配
    
    
    return attributeString;
}




@end
